package com.whfc.emp.helmet;

import com.alibaba.fastjson.JSONObject;
import com.whfc.common.exception.BizException;
import com.whfc.common.util.HttpUtil;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Map;
import java.util.TreeMap;

@Component
public class ZbznApi {
    // 筑邦智能安全帽操作
    private static final String appId = "2cf06943cb804acfbcd20c71d1cabdd8";

    private static final String secret = "c1b0727fb57d4cc4b72fe35eccfa4e4c";

    // 发送内置语音链接
    private static final String sendVoiceUrl = "https://www.loctp.com/api/crm/v1/sendVoice";

    // 发送自定义语音
    private static final String sendTextToAudioUrl = "https://www.loctp.com/api/crm/v1/textToAudio";

    // 更新设备上传频率
    private static final String uploadRateUrl = "https://www.loctp.com/api/crm/v1/uploadRate";


    public static void main(String[] args) {
//        String testSign = "615ff7633cd069e7b1eb8e17230a4fe3";
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("appid","test");
//        jsonObject.put("data","359972069707757");
//        jsonObject.put("secret","962012d09b8170d912f0669f6d7d9d07");
//        jsonObject.put("timestamp",1551255028);
//        jsonObject.put("voice_type",2);
//        apisign(jsonObject);
//        System.out.println(jsonObject.toString());
//        System.out.println(jsonObject.getString("sign").equals("615ff7633cd069e7b1eb8e17230a4fe3"));
//        JSONObject jsonObject = sendVoice("861714051695496", 3);
//        System.out.println(jsonObject.toString());
//
//
        JSONObject jsonObject2 = sendTextToAudio("861714051695496", 1,"1");
        System.out.println(jsonObject2.toString());

//        JSONObject jsonObject3 = uploadRate("861714051695496", 300);
//        System.out.println(jsonObject3.toString());
    }
//    vociceType：
//            · 1:防空报警。
//            · 2:请带好安全帽。
//            · 3:危险请注意。
//            · 7:已收到报警，请等待救援。
//            · 8:附近有人需要救援。
//            · 9:请不要违规作业。
//            · 10 :请回到岗位。
//            · 11:请到办公室。
//            · 12 :请充电。
//            · 13:请联系管理人员。
//            · 14:你是否需要帮助。
//            · 15:请立即撤离。
//            · 16 :请回电。

    /**
     * 发送内置语音
     * @param data
     * @param vociceType
     * @return
     */
    public  static JSONObject sendVoice(String data,Integer vociceType) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("appid",appId);
        jsonObject.put("data",data);
        jsonObject.put("secret",secret);
        jsonObject.put("timestamp",System.currentTimeMillis()/1000);
        jsonObject.put("voice_type",vociceType);
        apisign(jsonObject);
        String result = HttpUtil.doPost(sendVoiceUrl, JSONObject.toJSONString(jsonObject));
        JSONObject jsonData = JSONObject.parseObject(result);
        return jsonData;
    }

    /**
     * 发送自定义语音
     * @param data
     * @param count
     * @param text
     * @return
     */
    public  static JSONObject sendTextToAudio(String data,Integer count,String text) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("appid",appId);
        jsonObject.put("data",data);
        jsonObject.put("secret",secret);
        jsonObject.put("text",text);
        jsonObject.put("time",count);
        jsonObject.put("timestamp",System.currentTimeMillis()/1000);
        apisign(jsonObject);
        String result = HttpUtil.doPost(sendTextToAudioUrl, JSONObject.toJSONString(jsonObject));
        JSONObject jsonData = JSONObject.parseObject(result);
        return jsonData;
    }

    /**
     * 数据采集频率
     * @param data
     * @param second
     * @return
     */
    public  static JSONObject uploadRate(String data,Integer second) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("appid",appId);
        jsonObject.put("data",data);
        jsonObject.put("secret",secret);
        jsonObject.put("timestamp",System.currentTimeMillis()/1000);
        jsonObject.put("rate_time",second);
        apisign(jsonObject);
        String result = HttpUtil.doPost(uploadRateUrl, JSONObject.toJSONString(jsonObject));
        JSONObject jsonData = JSONObject.parseObject(result);
        return jsonData;
    }


    private static void apisign(JSONObject jsonParams) {
        StringBuilder param = new StringBuilder();
        Map<String, Object> sortParams = new TreeMap<>(jsonParams);
        for (Map.Entry<String, Object> entry : sortParams.entrySet()) {
            String value = entry.getValue().toString();
            param.append(value);
            param.append("&");
            String strParam = param.substring(0, param.length() - 1).toLowerCase();
            System.out.println("strParam:"    +   strParam);
                    StringBuilder sign = new StringBuilder(32);
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                byte[] array = md.digest(strParam.getBytes(StandardCharsets.UTF_8));
                for (byte b : array) {
                    sign.append(Integer.toHexString((b & 0xFF)|0x100).toUpperCase().substring(1, 3));
                }
            } catch (Exception e) {
                throw new BizException("500","md5 签名加密失败");
            }
            jsonParams.put("sign",sign.toString().toLowerCase());
        }
    }
}